home *** CD-ROM | disk | FTP | other *** search
/ Young Minds / Young Minds Interactive CD-ROM.ISO / spacewar / remove.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-05-31  |  3.6 KB  |  141 lines

  1. /*
  2.  * Spacewar - remove (nicely) an object from the universe (crft, torp, aln)
  3.  *          fixes (*)lhit,atck,dock,hom,auto
  4.  *          aliens are relocated (as if removed and replaced) when removed
  5.  *          torps are NOT removed if firing crft/aln removed
  6.  *          torps report a miss if fired at crft/torp/aln removed
  7.  *
  8.  * Copyright 1985 obo Systems, Inc.
  9.  * Copyright 1985 Dan Rosenblatt
  10.  */
  11.  
  12. #include "spacewar.h"
  13. #ifndef VMS
  14. #include <sys/types.h>
  15. #else /* BSD SYSIII SYSV */
  16. #include <types.h>
  17. #endif /* VMS */
  18. #include "universe.h"
  19. #include "sys.h"
  20. #include "login.h"
  21. #include "crft.h"
  22. #include "obj.h"
  23. #include "torp.h"
  24. #include "flds.h"
  25. #include "aln.h"
  26.  
  27. VOID remove(prmv)
  28. idxptr prmv;
  29. {
  30.     struct universe *puniv=univlst+MAXUNIVERSE;
  31.     struct aln *paln;
  32.     struct crft *pcrft;
  33.     int i;
  34.     struct torp *ptorp;
  35.  
  36. #ifdef DEBUG
  37.     DBG("remove(#%d/'%c/%c')\n",prmv.ip_ptr-univlst,prmv.ip_ptr->uv_type,
  38.     prmv.ip_ptr->uv_pctr);
  39. #endif
  40.  
  41.     while (--puniv >= univlst) {
  42.         if (!puniv->uv_type) continue;
  43.         /*if (puniv == prmv.ip_ptr) continue;???*/
  44.  
  45.         switch(puniv->uv_type) {
  46.  
  47.         case 'A':
  48.             paln = puniv->uv_ptr.uv_aln;
  49.             if (paln->al_lhit.ip_ptr == prmv.ip_ptr) {
  50.             paln->al_lhit.ip_ptr = NULL;
  51.             paln->al_aeval = 0;
  52.             }
  53.             if (paln->al_atck.ip_ptr == prmv.ip_ptr) {
  54.             paln->al_atck.ip_ptr = NULL;
  55.             paln->al_dly = 0;
  56.             }
  57.             break;
  58.  
  59.         case 'P':
  60.             pcrft = puniv->uv_ptr.uv_crft;
  61.             if (pcrft->cr_dock.ip_ptr == prmv.ip_ptr) {
  62.             pcrft->cr_dock.ip_ptr = NULL;
  63.             pcrft->cr_scrn[7][15] = '?';
  64.             }
  65.             for (i=0;i < MHOM;++i)
  66.             if (pcrft->cr_hom[i].ip_ptr == prmv.ip_ptr) {
  67.                 pcrft->cr_hom[i].ip_ptr = NULL;
  68.                 biton(pcrft->cr_chng,BIT_HOMCHAN+i);
  69.             }
  70.             if (pcrft->cr_auto.ip_ptr == prmv.ip_ptr) {
  71.             pcrft->cr_auto.ip_ptr = NULL;
  72.             biton(pcrft->cr_chng,BIT_AUTOFFWD);
  73.             }
  74.             if (pcrft->cr_lhit.ip_ptr == prmv.ip_ptr)
  75.             pcrft->cr_lhit.ip_ptr = NULL;
  76.             break;
  77.  
  78.         case 'T':
  79.             ptorp = puniv->uv_ptr.uv_torp;
  80.             if (ptorp->tp_lhit.ip_ptr == prmv.ip_ptr)
  81.             ptorp->tp_lhit.ip_ptr = NULL;
  82.             if (ptorp->tp_fby.ip_ptr == prmv.ip_ptr) {
  83.             /**** don't remove (hee hee hee)****/
  84.             /****idxptr xrmv;        ****/
  85.             /****xrmv.ip_ptr = puniv;    ****/
  86.             /****remove(xrmv);        ****/
  87.             /****continue;            ****/
  88.             ptorp->tp_fby.ip_ptr = NULL;
  89.             }
  90.             if (ptorp->tp_aim.ip_ptr == prmv.ip_ptr) {
  91.             if (ptorp->tp_fby.ip_ptr &&
  92.             ptorp->tp_fby.ip_ptr->uv_type == 'P') {
  93.                 pcrft = ptorp->tp_fby.ip_ptr->uv_ptr.uv_crft;
  94.                 output(pcrft->cr_lgn,'B',0,0);
  95.                 setrpt(pcrft);
  96.                 rpt(pcrft,"Torpedo missed - target went away");
  97.                 fnshrpt(pcrft,1);
  98.             }
  99.             remove(ptorp->tp_univ);
  100.             continue;
  101.             }
  102.             break;
  103.         }
  104.     }
  105.  
  106.     /* relocate rather than remove aliens */
  107.     if (prmv.ip_ptr->uv_type == 'A') {
  108.         paln = prmv.ip_ptr->uv_ptr.uv_aln;
  109.  
  110.         /* zero out velocity, thrust, attack variables, subsystem damage */
  111.         vinit(paln->al_vel);
  112.         vinit(paln->al_thr);
  113.         paln->al_dly = 0;
  114.         paln->al_lhit.ip_ptr = NULL;
  115.         paln->al_atck.ip_ptr = NULL;
  116.         paln->al_aeval = 0;
  117.         for (i=0;i<MSYS;++i)
  118.         paln->al_sys[i].s_dmg = 0;
  119.         prmv.ip_ptr->uv_mass = 0;
  120.  
  121.         /* relocate */
  122.         for (i=0;i<3;++i)
  123.         paln->al_pstn[i] = MUL(paln->al_pstn[i],-2.);
  124.         vchngd(paln->al_univ.ip_ptr);
  125.  
  126.     /* actually remove the object */
  127.     } else {
  128.         if (prmv.ip_ptr->uv_type == 'T')
  129.         binit((char *)prmv.ip_ptr->uv_ptr.uv_torp,sizeof(struct torp));
  130.         else if (prmv.ip_ptr->uv_type == 'P')
  131.         binit((char *)prmv.ip_ptr->uv_ptr.uv_crft,sizeof(struct crft));
  132.         vrmv(prmv.ip_ptr);
  133.         binit((char *)prmv.ip_ptr,sizeof(*prmv.ip_ptr));
  134.     }
  135.  
  136.  
  137. #ifdef DEBUG
  138.     VDBG("remove return\n");
  139. #endif
  140. }
  141.